/**
 * dbmanager.h
 * Interface untuk modul dbmanager
 * Modul ini menangani pengambilan dan pengubahan data dari database
 * Fri, 4 Dec 2009
 * By Kristanto 13208071
 * */
 
#ifndef dbmanager_h
#define dbmanager_h

#include "../mesinkata/mesinkata.h"
#include "../internal/internal.h"
#include "../system/system.h"

//KONSTRUKTOR
void CreateEmptyStudents(TStudent *student);
/**
 *  I.S. : sembarang
 *  F.S. :  record Mahasiswa baru telah dibuat
 *  proses : membuat record Mahasiswa baru
 * */

void CreateEmptyTabStudents(TTabstudents *tabStudents);
/**
 *  I.S. : sembarang
 *  F.S. :  tabel Mahasiswa baru telah dibuat
 *  proses : membuat tabel Mahasiswa baru
 * */

void CreateEmptyLectures(TLecture *lecture);
/**
 *  I.S. : sembarang
 *  F.S. :  record Matakuliah baru telah dibuat
 *  proses : membuat record Matakuliah baru
 * */

void CreateEmptyTabLectures(TTablectures *tabLectures);
/**
 *  I.S. : sembarang
 *  F.S. :  tabel Matakuliah baru telah dibuat
 *  proses : membuat tabel Matakuliah baru
 * */

void CreateEmptyRelation(TLectures_Students *relation);
/**
 *  I.S. : sembarang
 *  F.S. :  record PengambilanMK baru telah dibuat
 *  proses : membuat record PengambilanMK baru
 * */

void CreateEmptyTabRelation(TTablectures_students *tabRelation);
/**
 *  I.S. : sembarang
 *  F.S. :  tabel PengambilanMK baru telah dibuat
 *  proses : membuat tabel PengambilanMK baru
 * */

TStudent CreateStudent(string NIM , string Nama , Date TglLahir , string KotaAsal , float IPK , int JumlahSKS);
/**
 * Membuat record Mahasiswa baru dari data yang ada
 * */

TLecture CreateLecture(string Kode , string Nama , int SKS , string Bidang);
/**
 * Membuat record Matakuliah baru dari data yang ada
 * */

TLectures_Students CreateRelation(string NIM , string Kode , int Semester , TAcademicYear ThnAkademik , char Nilai);
/**
 * Membuat record PengambilanMK baru dari data yang ada
 * */

void InsertStudentsRow(TTabstudents *tabStudents , TStudent student);
/**
 *  I.S.  : tabel Mahasiswa sudah terdefinisi, Mahasiswa sudah terdefinisi
 *  F.S. : tabel Mahasiswa terisi dengan Mahasiswa baru
 *  proses : memasukkan record Mahasiswa ke dalam tabel Mahasiswa
 * */

void InsertLecturesRow(TTablectures *tabLectures , TLecture lecture);
/**
 *  I.S.  : tabel Matakuliah sudah terdefinisi, Matakuliah sudah terdefinisi
 *  F.S. : tabel Matakuliah terisi dengan Matakuliah baru
 *  proses : memasukkan record Matakuliah ke dalam tabel Matakuliah
 * */

void InsertLectures_StudentsRow(TTablectures_students *tabLectures_Students , TLectures_Students lecture_student);
/**
 *  I.S.  : tabel PengambilanMK sudah terdefinisi, PengambilanMK sudah terdefinisi
 *  F.S. : tabel PengambilanMK terisi dengan PengambilanMK baru
 *  proses : memasukkan record PengambilanMK ke dalam tabel PengambilanMK
 * */


//I-O
void PrintStudentInfo(TStudent student);
/**
 *  I.S. : record Mahasiswa sudah terdefinisi
 *  F.S. : record Mahasiswa tampil pada layar
 *  proses : menampilkan record Mahasiswa pada layar
 * */

void PrintLectureInfo(TLecture lecture);
/**
 *  I.S. : record Matakuliah sudah terdefinisi
 *  F.S. : record Matakuliah tampil pada layar
 *  proses : menampilkan record Matakuliah pada layar
 * */

void PrintRelationInfo(TLectures_Students relation);
/**
 *  I.S. : record PengambilanMK sudah terdefinisi
 *  F.S. : record PengambilanMK tampil pada layar
 *  proses : menampilkan record PengambilanMK pada layar
 * */


//QUERY HANDLER
TTabstudents MergeTabStudent(TNodeList *NodeList);
/**
 * Membuat Tabel Mahasiswa baru yang merupakan gabungan dari Tabel Mahasiswa dari setiap Node dalam NodeList
 * */

TTablectures MergeTabLecture(TNodeList *NodeList);
/**
 * Membuat Tabel Matakuliah baru yang merupakan gabungan dari Tabel Mahasiswa dari setiap Node dalam NodeList
 * */

TTablectures_students MergeTabRelation(TNodeList *NodeList);
/**
 * Membuat Tabel PengambilanMK baru yang merupakan gabungan dari Tabel Mahasiswa dari setiap Node dalam NodeList
 * */

void RetrieveStudentsRecord(TAdjMatrix *m , TNodeList *NodeList , string ColumnName[10] , int NColumn , string Condition[21] , int ncond , boolean IsDetail , TNode Asal);
/**
 * I.S. : matriks m terdefinisi, NodeList terdefinisi,  TNodeAsal terdefinisi, IsDetail terdefinisi
 * F.S. : data Mahasiswa tampil pada layar
 * proses : Me-retrieve data Mahasiswa dari jaringan dengan kondisi tertentu dan menampilkannya sesuai dengan yang diminta pengguna
 * */

void RetrieveLecturesRecord(TAdjMatrix *m , TNodeList *NodeList , string ColumnName[10] , int NColumn , string Condition[21] , int ncond , boolean IsDetail , TNode Asal);
/**
 * I.S. : matriks m terdefinisi, NodeList terdefinisi,  TNodeAsal terdefinisi, IsDetail terdefinisi
 * F.S. : data Matakuliah tampil pada layar
 * proses : Me-retrieve data Matakuliah dari jaringan dengan kondisi tertentu dan menampilkannya sesuai dengan yang diminta pengguna
 * */

void RetrieveLectures_StudentsRecord(TAdjMatrix *m , TNodeList *NodeList , string ColumnName[10] , int NColumn , string Condition[21] , int ncond , boolean IsDetail , TNode Asal);
/**
 * I.S. : matriks m terdefinisi, NodeList terdefinisi,  TNodeAsal terdefinisi, IsDetail terdefinisi
 * F.S. : data PengambilanMK tampil pada layar
 * proses : Me-retrieve data PengambilanMK dari jaringan dengan kondisi tertentu dan menampilkannya sesuai dengan yang diminta pengguna
 * */

TTabstudents retrieveStudentsRecord(TAdjMatrix *m , TNodeList *NodeList , string ColumnName[10] , int NColumn , string Condition[21] , int ncond , boolean IsDetail , TNode Asal);
/**
 * Me-retrieve data Mahasiswa dari jaringan dengan kondisi tertentu dan memasukkannya ke dalam Tabel Mahasiswa baru
 * */

TTablectures retrieveLecturesRecord(TAdjMatrix *m , TNodeList *NodeList , string ColumnName[10] , int NColumn , string Condition[21] , int ncond , boolean IsDetail , TNode Asal);
/**
 * Me-retrieve data Matakuliah dari jaringan dengan kondisi tertentu dan memasukkannya ke dalam Tabel Matakuliah baru
 * */

TTablectures_students retrieveLectures_StudentsRecord(TAdjMatrix *m , TNodeList *NodeList , string ColumnName[10] , int NColumn , string Condition[21] , int ncond , boolean IsDetail , TNode Asal);
/**
 * Me-retrieve data PengambilanMK dari jaringan dengan kondisi tertentu dan memasukkannya ke dalam Tabel PengambilanMK baru
 * */

void InsertStudentsRecord(TAdjMatrix *m , TNode *node , TNodeList *NodeList , TStudent student , TNode Asal);
/**
 * I.S. : matriks m terdefinisi, NodeList terdefinisi,  TNodeAsal terdefinisi, node terdefinisi, student terdefinisi
 * F.S. : data Mahasiswa ditambahkan ke dalam tabel Mahasiswa pada Node yang ditentukan jika terhubung dengan Node asal, jika tidak, tidak terjadi apa-apa
 * proses : Memasukkan data Mahasiswa ke dalam Node tertentu dalam jaringan dan menampilkan jalur yang digunakan
 * */

void InsertLecturesRecord(TAdjMatrix *m , TNode *node , TNodeList *NodeList , TLecture lecture , TNode Asal);
/**
 * I.S. : matriks m terdefinisi, NodeList terdefinisi,  TNodeAsal terdefinisi, node terdefinisi, lecture terdefinisi
 * F.S. : data Matakuliah ditambahkan ke dalam tabel Matakuliah pada Node yang ditentukan jika terhubung dengan Node asal, jika tidak, tidak terjadi apa-apa
 * proses : Memasukkan data Matakuliah ke dalam Node tertentu dalam jaringan dan menampilkan jalur yang digunakan
 * */

void InsertLectures_StudentsRecord(TAdjMatrix *m , TNode *node , TNodeList *NodeList , TLectures_Students relation , TNode Asal);
/**
 * I.S. : matriks m terdefinisi, NodeList terdefinisi,  TNodeAsal terdefinisi, node terdefinisi, relation terdefinisi
 * F.S. : data PengambilanMK ditambahkan ke dalam tabel PengambilanMK pada Node yang ditentukan jika terhubung dengan Node asal, jika tidak, tidak terjadi apa-apa
 * proses : Memasukkan data PengambilanMK ke dalam Node tertentu dalam jaringan dan menampilkan jalur yang digunakan
 * */

void UpdateStudentsTable(TAdjMatrix *m , TNodeList *NodeList , TStudent student , string Condition[21] , int ncond , TNode Asal);
/**
 * I.S. : matriks m terdefinisi, NodeList terdefinisi,  TNodeAsal terdefinisi, node terdefinisi, student terdefinisi
 * F.S : data Mahasiswa yang sesuai dengan kondisi yang diminta sudah diubah menjadi seperti yang diinginkan
 * proses : Mengubah data Mahasiswa dari jaringan dengan kondisi tertentu dan menampilkan waktu total prosesnya
 * */

void UpdateLecturesTable(TAdjMatrix *m , TNodeList *NodeList , TLecture lecture , string Condition[21] , int ncond , TNode Asal);
/**
 * I.S. : matriks m terdefinisi, NodeList terdefinisi,  TNodeAsal terdefinisi, node terdefinisi, lecture terdefinisi
 * F.S : data Matakuliah yang sesuai dengan kondisi yang diminta sudah diubah menjadi seperti yang diinginkan
 * proses : Mengubah data Matakuliah dari jaringan dengan kondisi tertentu dan menampilkan waktu total prosesnya
 * */

void UpdateLectures_StudentsTable(TAdjMatrix *m , TNodeList *NodeList , TLectures_Students relation , string Condition[21] , int ncond , TNode Asal);
/**
 * I.S. : matriks m terdefinisi, NodeList terdefinisi,  TNodeAsal terdefinisi, node terdefinisi, relation terdefinisi
 * F.S : data PengambilanMK yang sesuai dengan kondisi yang diminta sudah diubah menjadi seperti yang diinginkan
 * proses : Mengubah data PengambilanMK dari jaringan dengan kondisi tertentu dan menampilkan waktu total prosesnya
 * */

void DeleteStudentsRecord(TAdjMatrix *m , TNodeList *NodeList , string Condition[21] , int ncond , TNode Asal);
/**
 * I.S. : matriks m terdefinisi, NodeList terdefinisi,  TNodeAsal terdefinisi, node terdefinisi, student terdefinisi
 * F.S. : data Mahasiswa yang sesuai dengan kondisi yang diminta sudah dihapus
 * proses : Menghapus data Mahasiswa dari jaringan dengan kondisi tertentu dan menampilkan waktu total prosesnya
 * */

void DeleteLecturesRecord(TAdjMatrix *m , TNodeList *NodeList , string Condition[21] , int ncond , TNode Asal);
/**
 * I.S. : matriks m terdefinisi, NodeList terdefinisi,  TNodeAsal terdefinisi, node terdefinisi, lecture terdefinisi
 * F.S. : data Matakuliah yang sesuai dengan kondisi yang diminta sudah dihapus
 * proses : Menghapus data Matakuliah dari jaringan dengan kondisi tertentu dan menampilkan waktu total prosesnya
 * */

void DeleteLectures_StudentsRecord(TAdjMatrix *m , TNodeList *NodeList , string Condition[21] , int ncond , TNode Asal);
/**
 * I.S. : matriks m terdefinisi, NodeList terdefinisi,  TNodeAsal terdefinisi, node terdefinisi, relation terdefinisi
 * F.S. : data PengambilanMK yang sesuai dengan kondisi yang diminta sudah dihapus
 * proses : Menghapus data PengambilanMK dari jaringan dengan kondisi tertentu dan menampilkan waktu total prosesnya
 * */


//PREDIKAT-PREDIKAT
int SearchStudent(TTabstudents *tabStudents , string NIM);
/**
 * Mencari posisi Mahasiswa dengan NIM tertentu pada Tabel Mahasiswa
 * */

int SearchLecture(TTablectures *tabLectures , string Kode);
/**
 * Mencari posisi Matakuliah dengan Kode tertentu pada Tabel Matakuliah
 * */

int SearchRelation(TTablectures_students *tabLectures_Students , string NIM , string Kode);
/**
 * Mencari posisi PengambilanMK dengan NIM dan kode tertentu pada Tabel PengambilanMK
 * */

boolean IsOperator(string cond);
/**
 * Mengembalikan true jika cond adalah operator
 * */

boolean SearchColumn(string ColumnName[10] , int NColumn , char *c);
/**
 * Mengembalikan true jika  Nama Kolom yang diminta ada pada array ColumnName
 * */

boolean IsStudentRowValid(string Condition[3] , TStudent student);
/**
 * Mengembalikan true jika data Mahasiswa memenuhi kondisi yang diberikan
 * */

boolean isStudentRowValid(string Condition[21] , int ncond , TStudent student);
/**
 * Mengembalikan true jika data Matakuliah memenuhi kondisi yang diberikan
 * */

boolean IsLectureRowValid(string Condition[3] , TLecture lecture);
/**
 * Mengembalikan true jika data PengambilanMK memenuhi kondisi yang diberikan
 * */

boolean isLectureRowValid(string Condition[21] , int ncond , TLecture lecture);
/**
 * Mengembalikan true jika data Mahasiswa memenuhi kondisi-kondisi yang diberikan
 * */

boolean IsLecture_StudentRowValid(string Condition[3] , TLectures_Students lecture_student);
/**
 *  Mengembalikan true jika data Matakuliah memenuhi kondisi-kondisi yang diberikan
 * */

boolean isLecture_StudentRowValid(string Condition[21] , int ncond , TLectures_Students lecture_student);
/**
 *  Mengembalikan true jika data PengambilanMK memenuhi kondisi-kondisi yang diberikan
 * */


//OPERASI PADA TAHUN AKADEMIK
boolean IsThnAkademikEqual(TAcademicYear thn1 , TAcademicYear thn2);
/**
 * Mengembalikan true jika thn1 sama dengan thn2
 * */

boolean IsThnAkademikLt(TAcademicYear thn1 , TAcademicYear thn2);
/**
 * Mengembalikan true jika thn1 lebih dahulu dibanding thn2
 * */

TAcademicYear StringToThnAkademik(string S);
/**
 * Mengubah string menjadi thnakademik
 * */

string ThnAkademikToString(TAcademicYear thn);
/**
 * Mengubah thnakademik menjadi string
 * */


//OPERASI LAIN
int GetSizeStudent(TStudent student);
/**
 * Menghasilkan ukuran dari record Mahasiswa
 * */

int GetSizeLecture(TLecture lecture);
/**
 * Menghasilkan ukuran dari record Matakuliah
 * */

int GetSizeLecture_Student(TLectures_Students lecture_student);
/**
 * Menghasilkan ukuran dari record PengambilanMK
 * */


//SINKRONISASI
void Synchronize(TNodeList *NodeList , TAdjMatrix *m , TNode Asal);
/**
 * I.S. : NodeList terdefinisi, matriks m terdefinisi, Asal terdefinisi
 * F.S. : Semua data dalam setiap tabel dari setiap node dalam nodelist sudah tersinkronisasi
 * proses : Menghapus record PengambilanMK yang NIM nya tidak ada di dalam tabel Mahasiswa,
	     Menghapus record PengambilanMK yang Kode nya tidak ada di dalam tabel Matakuliah,
	     Mengupdate seluruh IPK dan jumlahSKS yang ada dalam tabel Mahasiswa diambil dari tabel Matakuliah dan PengambilanMK
 * */


#endif
